package util.biz.excel;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * 读取配置
 *
 * @author: liW
 * @date: 2020/11/27 17:48
 */
@Data
public class ExcelConverConfig<T> {

  /**
   * 配置信息
   */
  private List<ExcelCell> list = new ArrayList<>();

  /**
   * 添加配置信息
   *
   * @param excelCell excelCell
   * @param <D> 从excel表中获取到的数据类型
   * @param <R> 实体需要的数据类型
   */
  public <D, R> void add(ExcelCell<T, D, R> excelCell) {
    list.add(excelCell);
  }

  /**
   * 单元格读取配置
   *
   * @param <T> 实体
   * @param <D> 从excel表中获取到的数据类型
   */
  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  public static class ExcelCell<T, D, R> {

    /**
     * 名称
     */
    private String title;

    /**
     * get方法函数
     */
    private Function<T, R> fun;

    /**
     * set方法函数
     */
    private BiConsumer<T, R> biConsumer;

    /**
     * 转换函数
     */
    private Function<D, R> converFunction;

    /**
     * 单元格
     */
    private int cellNo;

    /**
     * 最大长度，校验用
     */
    private int maxLength;

    /**
     * 是否校验--excel重复
     */
    private boolean excelRepeat;

    /**
     * 是否校验--数据库重复
     */
    private boolean dbRepeat;

    /**
     * 校验--是否必填
     */
    private boolean must;


    /**
     * 字符串类型的值获取
     *
     * @param biConsumer set方法函数
     * @param cellNo 单元格
     * @param maxLength 最大长度，校验用
     * @param <T> 实体
     * @return ExcelCell
     */
    public static <T> ExcelCell<T, String, String> getStrInstance(String title,
        Function<T, String> fun, BiConsumer<T, String> biConsumer, int cellNo, int maxLength,
        boolean excelRepeat, boolean dbRepeat, boolean must) {
      return new ExcelCell<>(title, fun, biConsumer, null, cellNo, maxLength, excelRepeat,
          dbRepeat, must);
    }

    /**
     * 其他类型的值获取
     *
     * @param title 名称
     * @param biConsumer set方法函数
     * @param converFunction 转换函数
     * @param cellNo 单元格
     * @param maxLength 最大长度，校验用
     * @param <T> 实体
     * @param <D> 从excel表中获取到的数据类型
     * @param <R> 实体需要的数据类型
     * @return ExcelCell
     */
    public static <T, D, R> ExcelCell<T, D, R> getTypeInstance(String title,
        Function<T, R> fun, BiConsumer<T, R> biConsumer, Function<D, R> converFunction, int cellNo, int maxLength,
        boolean excelRepeat, boolean dbRepeat, boolean must) {
      return new ExcelCell<>(title, fun, biConsumer, converFunction, cellNo, maxLength, excelRepeat, dbRepeat, must);
    }

  }


}
